package utils

import (
	"regexp"
	"strconv"
	"unicode"

	"github.com/gin-gonic/gin"
)

// 邮箱正则表达式
var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)

// IsValidEmail 验证邮箱格式是否正确
func IsValidEmail(email string) bool {
	return emailRegex.MatchString(email)
}

// IsValidPassword 验证密码强度
// 至少包含：8位字符、一个大写字母、一个小写字母、一个数字、一个特殊字符
func IsValidPassword(password string) bool {
	if len(password) < 8 {
		return false
	}

	var (
		hasUpper   bool
		hasLower   bool
		hasNumber  bool
		hasSpecial bool
	)

	for _, char := range password {
		switch {
		case unicode.IsUpper(char):
			hasUpper = true
		case unicode.IsLower(char):
			hasLower = true
		case unicode.IsNumber(char):
			hasNumber = true
		case unicode.IsPunct(char) || unicode.IsSymbol(char):
			hasSpecial = true
		}
	}

	return hasUpper && hasLower && hasNumber && hasSpecial
}

// IsValidPhone 验证手机号格式（中国大陆）
func IsValidPhone(phone string) bool {
	pattern := regexp.MustCompile(`^1[3-9]\d{9}$`)
	return pattern.MatchString(phone)
}

// IsValidUsername 验证用户名格式
// 4-20位字符，只能包含字母、数字、下划线
func IsValidUsername(username string) bool {
	if len(username) < 4 || len(username) > 20 {
		return false
	}
	pattern := regexp.MustCompile(`^[a-zA-Z0-9_]+$`)
	return pattern.MatchString(username)
}

// ParseUintParam 解析uint类型的路由参数
func ParseUintParam(c *gin.Context, param string) (uint, error) {
	id, err := strconv.ParseUint(c.Param(param), 10, 32)
	if err != nil {
		return 0, err
	}
	return uint(id), nil
}
